/* eslint-disable no-param-reassign */
import { fetchDeliveryAddressList } from '../../../../services/address/fetchAddress';
import Toast from 'tdesign-miniprogram/toast/index';
import { resolveAddress, rejectAddress } from './util';
import { getAddressPromise } from '../edit/util';
import { api } from '../../../../config/api';
import { request } from '../../../../utils/request'

Page({
	data: {
		addressList: [],
		deleteID: '',
		showDeleteConfirm: false,
		isOrderSure: false,
	},

	/** 选择模式 */
	selectMode: false,
	/** 是否已经选择地址，不置为true的话页面离开时会触发取消选择行为 */
	hasSelect: false,

	onLoad(query) {
		const { selectMode = '', isOrderSure = '', id = '' } = query;
		this.setData({
			isOrderSure: !!isOrderSure,
			id,
		});
		this.selectMode = !!selectMode;
		this.init();
	},

	init() {
		this.getAddressList();
	},
	onUnload() {
		if (this.selectMode && !this.hasSelect) {
			rejectAddress();
		}
	},
	getAddressList() {
		const { id } = this.data;
		fetchDeliveryAddressList().then((addressList) => {
			addressList.forEach((address) => {
				if (address.id === id) {
					address.checked = true;
				}
			});
			this.setData({ addressList });
		});
	},
	getWXAddressHandle() {
		wx.chooseAddress({
			success: (res) => {
				if (res.errMsg.indexOf('ok') === -1) {
					Toast({
						context: this,
						selector: '#t-toast',
						message: res.errMsg,
						icon: '',
						duration: 1000,
					});
					return;
				}
				Toast({
					context: this,
					selector: '#t-toast',
					message: '添加成功',
					icon: '',
					duration: 1000,
				});
				const { length: len } = this.data.addressList;
				this.setData({
					[`addressList[${len}]`]: {
						name: res.userName,
						phoneNumber: res.telNumber,
						address: `${res.provinceName}${res.cityName}${res.countryName}${res.detailInfo}`,
						isDefault: 0,
						tag: '微信地址',
						id: len,
					},
				});
			},
		});
	},
	confirmDeleteHandle({ detail }) {
		const { id } = detail || {};
		if (id !== undefined) {
			this.setData({ deleteID: id, showDeleteConfirm: true });
			Toast({
				context: this,
				selector: '#t-toast',
				message: '地址删除成功',
				theme: 'success',
				duration: 1000,
			});
		} else {
			Toast({
				context: this,
				selector: '#t-toast',
				message: '需要组件库发新版才能拿到地址ID',
				icon: '',
				duration: 1000,
			});
		}
	},
	deleteAddressHandle(e) {
		const { id } = e.currentTarget.dataset;
		const me = this;
		wx.showLoading({
			title: '删除中',
		});
		request.delete(`${api.user.addressRemove}?id=${id}`)
			.then(res => {
				wx.hideLoading();
				me.setData({
					addressList: me.data.addressList.filter((address) => address.id !== id),
					deleteID: '',
					showDeleteConfirm: false,
				});
			});
	},
	editAddressHandle({ detail }) {
		this.waitForNewAddress();

		const { id } = detail || {};
		wx.navigateTo({ url: `/pages/usercenter/address/edit/index?id=${id}` });
	},
	selectHandle({ detail }) {
		if (this.selectMode) {
			this.hasSelect = true;
			resolveAddress(detail);
			wx.navigateBack({ delta: 1 });
		} else {
			this.editAddressHandle({ detail });
		}
	},
	createHandle() {
		this.waitForNewAddress();
		wx.navigateTo({ url: '/pages/usercenter/address/edit/index' });
	},

	waitForNewAddress() {
		getAddressPromise()
			.then((newAddress) => {
				let addressList = [...this.data.addressList];

				newAddress.phoneNumber = newAddress.phone;
				newAddress.address = `${newAddress.provinceName}${newAddress.cityName}${newAddress.districtName}${newAddress.detailAddress}`;
				newAddress.tag = newAddress.addressTag;

				if (!newAddress.addressId) {
					newAddress.id = `${addressList.length}`;
					newAddress.addressId = `${addressList.length}`;

					if (newAddress.isDefault === 1) {
						addressList = addressList.map((address) => {
							address.isDefault = 0;

							return address;
						});
					} else {
						newAddress.isDefault = 0;
					}

					addressList.push(newAddress);
				} else {
					addressList = addressList.map((address) => {
						if (address.addressId === newAddress.addressId) {
							return newAddress;
						}
						return address;
					});
				}

				addressList.sort((prevAddress, nextAddress) => {
					if (prevAddress.isDefault && !nextAddress.isDefault) {
						return -1;
					}
					if (!prevAddress.isDefault && nextAddress.isDefault) {
						return 1;
					}
					return 0;
				});

				this.setData({
					addressList: addressList,
				});
			})
			.catch((e) => {
				if (e.message !== 'cancel') {
					Toast({
						context: this,
						selector: '#t-toast',
						message: '地址编辑发生错误',
						icon: '',
						duration: 1000,
					});
				}
			});
	},
});
